package com.client.elements.normal.boxes;

import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

public class Datebox {

	public static Widget datebox(){
		//Elemente erzeugen
		final HTML hinweis = new HTML("TT.MM.JJJJ");
		final TextBox datum = new TextBox();
		datum.setText("");
		datum.addStyleName("red_Background");

		//Elemente hinzufuegen
		FlowPanel panel = new FlowPanel();
		panel.add(hinweis);
		panel.add(datum);
		datum.addValueChangeHandler(new ValueChangeHandler<String>() {
			@Override
			public void onValueChange(ValueChangeEvent<String> event) {
				String datum_ueberprueft = ueberpruefeFormat(datum.getValue());
				if (datum_ueberprueft == null) {
					datum.addStyleName("red_Background");
				}else {
					datum.removeStyleName("red_Background");
					datum.setValue(datum_ueberprueft);
				}
			}
		});
		return panel;
	}

	/*Das eingegebene Datum wird auf Richtigkeit �berpr�ft*/
	public static String ueberpruefeFormat(String datum){
		//2 Punkte m�ssen vorhanden sein
		int anzahlpunkte = 0;
		for (int i = 0; i < datum.length(); i++) {
			if (datum.substring(i, i+1).equals(".")) {
				anzahlpunkte++;
			}
		}
		if (anzahlpunkte!=2) {
			return null;
		}

		//korrektes Format
		int tag, monat, jahr;
		try {
			tag = Integer.parseInt(datum.substring(0, datum.indexOf(".")));
			datum = datum.substring(datum.indexOf(".") + 1, datum.length());
			monat = Integer.parseInt(datum.substring(0, datum.indexOf(".")));
			datum = datum.substring(datum.indexOf(".") + 1, datum.length());
			jahr = Integer.parseInt(datum);
		} catch (NumberFormatException e) {
			return null;
		}

		if ((tag>31)||(monat>12)||(tag<1)||(monat<1)||(jahr>3000)) {
			return null;
		}

		//�berpr�fung der Anzahl der Tage anhand des Monats
		//Wenn 31 eingegeben wird und der Monat nur 30 Tage hat, wird der 30. ausgew�hlt.
		if ((tag==31)&&(((monat<8)&&(monat%2==0))||(monat>=8)&&(monat%2!=0))) {
			tag = 30;
		}

		//Februar/Schaltjahre
		if ((tag>28)&&(monat==2)) {
			if ((((jahr%4==0)&&(jahr%400==0)))||(jahr%4==0)&&(jahr%100!=0)) {
				tag = 29;
			}else {
				tag = 28;
			}
		}

		//Ausgabe vorbereiten
		String tag_ausgabe, monat_ausgabe, jahr_ausgabe;

		if (tag<10) {
			tag_ausgabe = "0" + tag;
		}else {
			tag_ausgabe = "" + tag;
		}

		if (monat<10) {
			monat_ausgabe = "0" + monat;
		}else {
			monat_ausgabe = "" + monat;
		}

		if (jahr<10) {
			jahr_ausgabe = "200" + jahr;
		}else if (jahr<100) {
			jahr_ausgabe = "20" + jahr;
		}else if (jahr<1000) {
			jahr_ausgabe = "2" + jahr;
		}else {
			jahr_ausgabe = "" + jahr;
		}

		return tag_ausgabe + "." + monat_ausgabe + "." + jahr_ausgabe;
	}
}